package com.example.hetong_system.service;

import com.example.hetong_system.model.Contract;
import com.example.hetong_system.model.MilestonePlan;
import com.example.hetong_system.model.PaymentPlan;
import com.example.hetong_system.repository.ContractRepository;
import com.example.hetong_system.repository.MilestonePlanRepository;
import com.example.hetong_system.repository.PaymentPlanRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.time.LocalDateTime;

/**
 * 支付计划与里程碑计划关联服务（核心：点击支付后自动创建记录）
 */
@Service
public class PaymentAndMilestoneService {

    private static final Logger logger = LoggerFactory.getLogger(PaymentAndMilestoneService.class);

    @Autowired
    private PaymentPlanRepository paymentPlanRepository;
    @Autowired
    private MilestonePlanRepository milestonePlanRepository;
    @Autowired
    private ContractRepository contractRepository;

    /**
     * 点击支付后自动创建payment_plan和milestone_plan记录
     * @param contractId 合同ID（关联contract表id）
     * @param amount 支付金额（用户输入，对应payment_plan.amount）
     * @param type 支付类型（deposit：定金；execution：执行款）
     * @return 新创建的payment_plan的id（供前端发起支付用）
     */
    @Transactional(rollbackFor = Exception.class) // 事务保证：两个表要么都创建成功，要么都失败
    public Long createPaymentAndMilestonePlan(Long contractId, BigDecimal amount, String type) {
        // 1. 校验合同是否存在（关联contract表）
        Contract contract = contractRepository.findById(contractId)
                .orElseThrow(() -> new IllegalArgumentException("合同不存在（ID：" + contractId + "）"));

        // 2. 创建payment_plan记录（对应数据库payment_plan表）
        PaymentPlan paymentPlan = new PaymentPlan();
        paymentPlan.setContractId(contractId); // 关联合同ID
        paymentPlan.setInstallments(1); // 默认为1期（对应installments字段）
        paymentPlan.setAmount(amount); // 支付金额（用户输入）
        paymentPlan.setPaymentDate(LocalDateTime.now()); // 支付日期（当前时间）
        paymentPlan.setIsExecuted(false); // 初始未支付（对应is_executed字段）
        // 其他字段（out_trade_no等）暂不设置，支付时由支付宝接口生成
        PaymentPlan savedPaymentPlan = paymentPlanRepository.save(paymentPlan);
        logger.info("创建payment_plan成功，ID：{}，合同ID：{}", savedPaymentPlan.getId(), contractId);

        // 3. 创建/更新milestone_plan记录（对应数据库milestone_plan表）
        // 3.1 先查询该合同是否已有里程碑计划（避免重复创建）
        MilestonePlan milestonePlan = milestonePlanRepository.findByContractId(contractId)
                .orElse(new MilestonePlan()); // 若不存在则新建

        // 3.2 设置里程碑基本信息（关联合同+状态）
        milestonePlan.setContractId(Math.toIntExact(contractId)); // 关联合同ID
//        milestonePlan.setStatus(contract.getMilestoneStatus()); // 同步合同当前里程碑状态（对应contract表的milestone_status）
        milestonePlan.setCreateTime(LocalDateTime.now()); // 创建时间

        // 3.3 根据支付类型（定金/执行款）关联payment_plan（核心关联逻辑）
        if ("deposit".equals(type)) {
            // 定金：关联到deposit_payment_id字段
            milestonePlan.setDepositPaymentId(savedPaymentPlan.getId());
            milestonePlan.setDepositStageDesc("定金支付阶段（自动创建）"); // 定金描述
        } else if ("execution".equals(type)) {
            // 执行款：关联到execution_payment_id字段
            milestonePlan.setExecutionPaymentId(savedPaymentPlan.getId());
            milestonePlan.setExecutionStageDesc("执行款支付阶段（自动创建）"); // 执行款描述
        } else {
            throw new IllegalArgumentException("支付类型错误（仅支持deposit/execution）");
        }

        // 3.4 保存里程碑计划
        MilestonePlan savedMilestonePlan = milestonePlanRepository.save(milestonePlan);
        logger.info("创建/更新milestone_plan成功，ID：{}，合同ID：{}", savedMilestonePlan.getId(), contractId);

        // 4. 返回新创建的payment_plan的ID（供前端发起支付用）
        return savedPaymentPlan.getId();
    }
}